#include "udprecive.h"
#include <QDebug>

/****************************************
* 作者/公司  : 有志小青年
* 函数介绍   : 构造函数
* 输入参数   : 参数1：端口
* 输出参数   :
* 返回值     :
*****************************************/
UdpReciver::UdpReciver(int port, QObject *parent) : QObject(parent)
{
    m_thread = new QThread();
    m_udpSocket = new QUdpSocket();
    init_port(port);
    connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(readDatagrams()), Qt::DirectConnection);
    this->moveToThread(m_thread);
    m_udpSocket->moveToThread(m_thread);
    m_thread->start();
}

/****************************************
* 作者/公司  : 有志小青年
* 函数介绍   : 析构函数
* 输入参数   :
* 输出参数   :
* 返回值     :
*****************************************/
UdpReciver::~UdpReciver()
{
    m_thread->quit();

    m_thread->wait();
    m_thread->deleteLater();
    m_udpSocket->close();
    m_udpSocket->deleteLater();
}

/****************************************
* 作者/公司  : 有志小青年
* 函数介绍   : 设置ip及端口
* 输入参数   :
* 输出参数   :
* 返回值     :
*****************************************/
void UdpReciver::init_port(QString tmphost, int tmport)
{
    m_port = tmport;
    m_localhost = tmphost;
    m_udpSocket->bind(QHostAddress(m_localhost), m_port);
}

/****************************************
* 作者/公司  : 有志小青年
* 函数介绍   : 设置端口
* 输入参数   :
* 输出参数   :
* 返回值     :
*****************************************/
void UdpReciver::init_port(int tmport)
{
    m_port = tmport;
    m_udpSocket->bind(m_port);
}

/****************************************
* 作者/公司  : 有志小青年
* 函数介绍   : 数据回调函数
* 输入参数   :
* 输出参数   :
* 返回值     :
*****************************************/
void UdpReciver::readDatagrams()
{
    QHostAddress client_address; //client ip addr
    m_data.clear();
    while(m_udpSocket->hasPendingDatagrams())
    {
        m_data.resize(m_udpSocket->pendingDatagramSize());
        m_udpSocket->readDatagram(m_data.data(), m_data.size(), &client_address);
        strclient_address = client_address.toString();
        deliverInfo(m_data, strclient_address);

        //qDebug() << "receive UDP's size:" << m_data.data();
    }
}
